Estas graficas describen los casos de Virus del Dengue registrados en la base de datos “bd_Dengue” (“https://gitlab.com/AndreaSilva/LSB/tree/master/Piloto_Dengue/data/Base_Datos/Base_Datos_Dengue”) que reportan el Genoma y el Gen de la envoltura (Gen E). Estos casos cumplen con las siguientes condiciones:

Genoma:

Gen E:

Genoma y Gen E

Figura 1. Del total de casos registrados en la base de datos, alrededor de 8.000 casos reportan la secuencia del Gen E, siendo el Gen con mayor frecuencia. Los casos que reportan el Genoma Completo son el segundo con mayor frecuencias, y son alrededor de 4.000 casos.

Genoma Completo

Tabla 1. Los datos con Genoma Completo son 3.884 casos que cumplen con las condiciones planteadas al inicio, de los cuales se tiene información sobre el Numero de Aceso, Serotipo, genotipo, asi como el pais, localidad (coordenadas) y año en que fueron reportados los casos.

Gen de la Envoltura (Gen E)

Tabla 2. Los datos del Gen E son 5.614 casos que cumplen con las condiciones planteadas, de los cuales se tiene información sobre el Numero de Aceso, Serotipo, genotipo, asi como el pais, localidad (coordenadas) y año en que fueron reportados los casos.

Serotipos

Figura 2. Frecuencias de los serotipos para Gen E y Genoma. Los serotipos de los casos con Genoma presentan el mismo patron que los serotipos de toda la base de datos, donde el serotipo 1 tiene mayor frecuencia seguido del serotipo 2, 3 y 4. Por el contrario, en los casos con Gen E el serotipo 4 tiene mayor frecuecia que el serotipo 3.

Paises para datos con Genoma

Figura 3. Paises reportados para casos con Genoma Completo. El pais con mayor numero de casos es VietNam (1092 casos), al igual que en la base de datos total. Luego le siguen Nicaragua, Puerto Rico y Singapur. Cabe resaltar que entre los 10 paises con mayor frecuancia se encuentran 5 paises de America Latina (Nicaragua(2), Puerto Rico(3), Venezuela(5), Brazil(6), Mexico(8)) y 5 paises de Asia (VietNam(1), Singapur(4), Cambodia(7), Tailandia(9), Indonesia(10))

Paises para datos con Gen E

Figura 4. Paises reportados para casos con Gen E. El pais con mayor numero de casos es Singapur (750 casos), seguido de Tailandia (725 casos) y China (672). Entre los 10 paises con mayor frecuancia se encuentran 2 paises de America Latina (Brazil(5), Mexico(10)), 2 islas (French Polynesia(8), Nueva Caledonia(9)) y 6 paises de Asia (Singapur(1), Tailandia(2), China (3), VietNam(4), Indonesia(6), Malasia(7)).

Mapa-Mundi: Numero de casos reportados por paises

Figura 5. Mapa-mundi del numero de casos reportados en cada paises. En esta grafica se puede apreciar que la frecuencia de los casos que reportan el Genoma es homogenea entre los paises de America Latina y Asia (> 250 < 500). Sin embargo es muy notorio que VietNam tiene alta frecuencia ( alrededor de 1000 casos). Los casos que reportan el Gen E tiene frecuencias mas heterogeneas porque 4 paises de Asia reportan las frecuencias mas altas (> 600), mientras que en America Latina el pais con mayor numero de casos es Brasil (> 400 < 600), los demas reportan no mas de 200 casos. Tanto los casos que reportan Genoma como Gen E tiene baja frecuencias en los paises africanos (< 200), esto tambien se observa en la base de datos completa.

Distribucion de los serotipos por paises: Casos que reportan Genoma

Figura 6. Los serotipos de los casos que reportan el Genoma se distribuyen por toda la region tropical y subtropical.

Paises reportados en casos con Gen E

Figura 7. Los serotipos de los casos que reportan el Gen E se distribuyen por toda la region tropical y subtropical.

Localidades: Genoma

Figura 8. Nube de localidades para casos que reportan el Genoma. Las localidades que mas estan reportadas pertenecen a VietNam (Sur de Vietnam con 1092 casos representando casi la totalidad de casos que reporta este país), Cambidia (KCH con 115), Nicaragua (Managua con 323 casos), y Venezuela (Aragua con 192 casos).

Localidades: Gen E

Figura 9. Nube de localidades para casos que reportan el Gen E. Las localidades que mas estan reportadas pertenecen a Tailandia (Bangkok con 265 casos, kamphaengphet con 121 casos), China (Guangzhou con 86 casos), French Polynesia (Tahiti con 79 casos), VietNam (Mekong Delta con 56 casos), e Indonesia (Bali con 59 casos, Surabaya con 57 casos). Todos paises asiaticos.

Mapa-Mundi localidades

Figura 10. Distribución de los serotipos por localidades para casos con Genoma Completo. En cada pais donde se reportaron los casos hay presencia de los 4 serotipos, excepto en Peru, donde solo presenta serotipo 2, en Paraguay solo presenta serotipo 3 y Japon solo presenta serotipo 1.

Mapa-mundi localidades Gen E

Figura 11. Distribución de los serotipos por localidades para casos con Gen E. En brazil los casos reportados son solo del serotipo 1, en colombia son solo del serotipo 4, y en ecuador, peru, bolivia, y paraguay son del serotipo 2 los casos que se reporta su localidad.

Mapa-mundi de localidades para cada seroripo

Genoma

Figura 12. Distribución de cada serotipo en las localidades reportadas para casos que reportan el Genoma.

Gen E

Fifura 13. Distribución de cada serotipo en las localidades reportadas para casos que reportan el Gen E.

Años para datos que reportan Genoma

Figura 14. Años registrados para casos con Genoma. El año mas antiguo que se reporta es el año 1600 y el mas reciente es 2016. El año 2007 es el que se ha reportado mas con 805 casos. En general, a medida que avanza los años se aumenta el numero de casos reportados para cada año.

Frecuencia de los años reportados poa cada pais: Genoma

Figura 15. Frecuencia de los años reportados para cada pais en casos con Genoma. Algunos paises solo reportan un caso en un solo año, como es el caso del salvador, laos, e islas como Guam, Grenada e islas Cook. Sin embargo la mayoria de los paises han reportado mas de un caso en mas de un año. Cabe resaltar que de los alrededor de 800 casos que son reportados para el año 2007 (Figura 14.), alrededor de la mitad (411) pertencen a casos de VietNam. Tambien se puede observar que en general de los 1092 casos que reportan a VietNam (Figura 3) la mayoria pertenecen a los años 2006, 2007, 2008.

Años para datos que reportan Gen E

Figura 16. Años registrados para casos con Gen E. El año mas antiguo que se reporta es el año 1860 y el mas reciente es 2015. El año 2013 es el que se ha reportado mas con 937 casos. Igual que la Figura 14 a medida que avanza los años se aumenta el numero de casos reportados.

Frecuencia de los años reportados poa cada pais: Gen E

Figura 17. Frecuencia de los años reportados para cada pais en casos con Gen E. Los años con mayor numero de casos pertenecen a años recientes (1995-2014). El año 2014 reporta 400 casos (Figura 16.), de los cuales 259 casos son de China de 674 casos que este pais reporta. En brazil el 84% (370 casos) de los casos son reportados en el año 2013, que representa la mitad de casos reportados para ese año. Por el contrario para Singapur que es el pais con mas reportes (Figura .), los casos no pertenecen a un año es especial si no que se distribuyen mayoritariamente en los años 2007, 2008, 2009, 2010, 2011.

LS0tCnRpdGxlOiAiRGF0b3MgZGVzY2FyZ2Fkb3MgZGVsIEdlbm9tYSB5IEdlbiBFIGRlbCB2aXJ1cyBkZWwgRGVuZ3VlIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpFc3RhcyBncmFmaWNhcyBkZXNjcmliZW4gbG9zIGNhc29zIGRlIFZpcnVzIGRlbCBEZW5ndWUgcmVnaXN0cmFkb3MgZW4gbGEgYmFzZSBkZSBkYXRvcyAiYmRfRGVuZ3VlIiAoImh0dHBzOi8vZ2l0bGFiLmNvbS9BbmRyZWFTaWx2YS9MU0IvdHJlZS9tYXN0ZXIvUGlsb3RvX0Rlbmd1ZS9kYXRhL0Jhc2VfRGF0b3MvQmFzZV9EYXRvc19EZW5ndWUiKSBxdWUgcmVwb3J0YW4gZWwgR2Vub21hIHkgZWwgR2VuIGRlIGxhIGVudm9sdHVyYSAoR2VuIEUpLiBFc3RvcyBjYXNvcyBjdW1wbGVuIGNvbiBsYXMgc2lndWllbnRlcyBjb25kaWNpb25lczogCgoqIE5vIGVzdGFuIGRlc2lnbmFkb3MgcG9yIGVsIEdlbkJhbmsgY29tbzoKICAgICArIFF1aW1lcmFzCiAgICAgKyBDbG9uZXMKICAgICArIE5vIFZlcmlmaWNhZG9zCiogUmVwb3J0YW4gZWwgc2Vyb3RpcG8KKiBSZXBvcnRhbiBlbCBhw7FvIGRlIHJlZ2lzdHJvIHkvbyBSZXBvcnRhbiBlbCBwYWlzCgpHZW5vbWE6CgoqIExvbmdpdHVkIGRlIGxhIHNlY3VlbmNpYSA+IDEwMTAwIHBiLiBUZW5pZW5kbyBlbmN1ZW50YSBxdWUgZWwgZ2Vub21hIGRlbCB2aXJ1cyBkZWwgRGVndWUgZXMgZGUgYWxyZWRlZG9yIGRlIDExLjAwMCBwYgoqIEVsIEdlbkJhbmsgZXNwZWNpZmlxdWUgZWwgaW5pY2lvIHkgZmluYWwgZGVsIENEUwoKR2VuIEU6CgoqIExvbmdpdHVkIGRlIGxhIHNlY3VlbmNpYXMgPiAxMzAwIHBiIDwgMTYwMCBwYi4gVGVuaWVuZG8gZW5jdWVudGEgcXVlIGxhIGxvbmdpdHVkIGRlbCBnZW4gRSByZXBvcnRhZGEgcG9yIGxhcyBzZWN1ZW5jaWFzIGRlIHJlZmVyZW5jaWEgZGVsIEdlbkJuYWsgZXMgZGUgMTQ4NSBwYgoKCiMjIyBHZW5vbWEgeSBHZW4gRSMjIwpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA2LGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShmb3JjYXRzKQpsaWJyYXJ5KCJnZ3Bsb3QyIikKbGlicmFyeSgiUkNvbG9yQnJld2VyIikKCkdlbmVzIDwtIGFzLmNoYXJhY3Rlcih1bmlxdWUoZGF0b3MkR2VuZSkpCgpHZW5lcy5sZW5ndGggPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChHZW5lcykpewogIEdlbmVzLmxlbmd0aFtpLCJnZW5lX25hbWUiXSA8LSBHZW5lc1tpXQogIEdlbmVzLmxlbmd0aFtpLCJnZW5lX2NvdW50Il0gPC0gbGVuZ3RoKGRhdG9zW3doaWNoKGRhdG9zJEdlbmU9PUdlbmVzW2ldKSw2XSkKICBHZW5lcy5sZW5ndGhbMTIsImdlbmVfY291bnQiXSA8LSBsZW5ndGgod2hpY2goaXMubmEoZGF0b3MkR2VuZSk9PVQpKQp9CgpHZW5lcy5sZW5ndGggPC0gdHJhbnNmb3JtKEdlbmVzLmxlbmd0aCwgZ2VuZV9uYW1lPSByZW9yZGVyKGdlbmVfbmFtZSwgLWdlbmVfY291bnQpKQpnZ3Bsb3QoZGF0YSA9IEdlbmVzLmxlbmd0aFtjKDEsNyw5LDUsMTEpLF0sIGFlcyh4ID0gZ2VuZV9uYW1lLCB5ID0gZ2VuZV9jb3VudCkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbD0ic3RlZWxibHVlIikrCiAgbGFicyh4PSAiR2VuZSIsIHk9ICJEYXRhIE51bWJlciIpKwogIHRoZW1lX2NsYXNzaWMoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKCgpgYGAKKipGaWd1cmEgMS4gKiogRGVsIHRvdGFsIGRlIGNhc29zIHJlZ2lzdHJhZG9zIGVuIGxhIGJhc2UgZGUgZGF0b3MsIGFscmVkZWRvciBkZSA4LjAwMCBjYXNvcyByZXBvcnRhbiBsYSBzZWN1ZW5jaWEgZGVsIEdlbiBFLCBzaWVuZG8gZWwgR2VuIGNvbiBtYXlvciBmcmVjdWVuY2lhLiBMb3MgY2Fzb3MgcXVlIHJlcG9ydGFuIGVsIEdlbm9tYSBDb21wbGV0byBzb24gZWwgc2VndW5kbyBjb24gbWF5b3IgZnJlY3VlbmNpYXMsIHkgc29uIGFscmVkZWRvciBkZSA0LjAwMCBjYXNvcy4KCgojIyMgR2Vub21hIENvbXBsZXRvICMjIwpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA2LGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShhcGUpCmxpYnJhcnkoc2VxaW5yKQoKIyMgR0VOT01BCgpiZF9kZW5ndWUgPC0gcmVhZC5jc3YoZmlsZSA9ICIvaG9tZS9hbmRyZWEvTFNCL1BpbG90b19EZW5ndWUvZGF0YS9CYXNlX0RhdG9zL0Jhc2VfRGF0b3NfRGVuZ3VlL2JkX0Rlbmd1ZS5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRikKCnNlcV9nZW5vbWEgPC0gcmVhZC5mYXN0YShmaWxlID0gIi9ob21lL2FuZHJlYS9MU0IvUGlsb3RvX0Rlbmd1ZS9kYXRhL1NlY3VlbmNpYXNfZGVzY2FyZ2FkYXMvU2VjdWVuY2lhc19nZW5vbWFfY29tcGxldG8vU2VjdWVuY2lhc19nZW5vbWFfY29tcGxldG8uZmFzdGEiKQoKTmFtZXMgPC0gYXR0cihzZXFfZ2Vub21hLCAibmFtZSIpCgojd3JpdGUuY3N2KE5hbWVzLCBmaWxlID0gIi9ob21lL2FuZHJlYS9MU0IvUGlsb3RvX0Rlbmd1ZS9kYXRhL1NlY3VlbmNpYXNfZGVzY2FyZ2FkYXMvU2VjdWVuY2lhc19nZW5vbWFfY29tcGxldG8vaWRfZGVzY2FyZ2FkYXMuY3N2IikKCmlkX2Rlc2NhcmdhZGFzIDwtIHJlYWQuY3N2KGZpbGUgPSAiL2hvbWUvYW5kcmVhL0xTQi9QaWxvdG9fRGVuZ3VlL2RhdGEvU2VjdWVuY2lhc19kZXNjYXJnYWRhcy9TZWN1ZW5jaWFzX2dlbm9tYV9jb21wbGV0by9pZF9kZXNjYXJnYWRhcy5jc3YiKQoKcG9zaWNpb25fZ2Vub21lIDwtIHZlY3RvcigpCgpmb3IoaSBpbiAxOmxlbmd0aChpZF9kZXNjYXJnYWRhcyROX0FjY2VzaW9uKSl7CiAgcG9zaWNpb25fZ2Vub21lW2ldIDwtIHdoaWNoKGJkX2Rlbmd1ZSROX0FjY2VzaW9uPT1pZF9kZXNjYXJnYWRhcyROX0FjY2VzaW9uW2ldKQp9CgpHZW5vbWUgPC0gYmRfZGVuZ3VlW3Bvc2ljaW9uX2dlbm9tZSxdCgp3cml0ZS5jc3YoR2Vub21lLCBmaWxlID0gIi9ob21lL2FuZHJlYS9MU0IvUGlsb3RvX0Rlbmd1ZS9kYXRhL0Jhc2VfRGF0b3MvR2Vub21lLmNzdiIpCgpHZW5vbWUKYGBgCioqVGFibGEgMS4qKiBMb3MgZGF0b3MgY29uIEdlbm9tYSBDb21wbGV0byBzb24gMy44ODQgY2Fzb3MgcXVlIGN1bXBsZW4gY29uIGxhcyBjb25kaWNpb25lcyBwbGFudGVhZGFzIGFsIGluaWNpbywgZGUgbG9zIGN1YWxlcyBzZSB0aWVuZSBpbmZvcm1hY2nDs24gc29icmUgZWwgTnVtZXJvIGRlIEFjZXNvLCBTZXJvdGlwbywgZ2Vub3RpcG8sIGFzaSBjb21vIGVsIHBhaXMsIGxvY2FsaWRhZCAoY29vcmRlbmFkYXMpIHkgYcOxbyBlbiBxdWUgZnVlcm9uIHJlcG9ydGFkb3MgbG9zIGNhc29zLiAgCgoKIyMjIEdlbiBkZSBsYSBFbnZvbHR1cmEgKEdlbiBFKSAjIyMKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNixlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMjIEdFTiBFCgpzZXFfZ2VuZSA8LSByZWFkLmZhc3RhKGZpbGUgPSAiL2hvbWUvYW5kcmVhL0xTQi9QaWxvdG9fRGVuZ3VlL2RhdGEvU2VjdWVuY2lhc19kZXNjYXJnYWRhcy9TZWN1ZW5jaWFzX2dlbkUvR2VuX0UuZmFzdGEiKQoKaWRfZ2VuZSA8LSBhdHRyKHNlcV9nZW5lLCAibmFtZSIpCgpwb3NpdGlvbl9nZW5lIDwtIHZlY3RvcigpCgpmb3IoaSBpbiAxOmxlbmd0aChpZF9nZW5lKSl7CiAgcG9zaXRpb25fZ2VuZVtpXSA8LSB3aGljaChiZF9kZW5ndWUkTl9BY2Nlc2lvbj09aWRfZ2VuZVtpXSkKfQoKR2VuRSA8LWJkX2Rlbmd1ZVtwb3NpdGlvbl9nZW5lLF0KCndyaXRlLmNzdihHZW5FLCBmaWxlID0gIi9ob21lL2FuZHJlYS9MU0IvUGlsb3RvX0Rlbmd1ZS9kYXRhL0Jhc2VfRGF0b3MvR2VuRS5jc3YiKQoKR2VuRQoKYGBgCioqVGFibGEgMi4qKiBMb3MgZGF0b3MgZGVsIEdlbiBFIHNvbiA1LjYxNCBjYXNvcyBxdWUgY3VtcGxlbiBjb24gbGFzIGNvbmRpY2lvbmVzIHBsYW50ZWFkYXMsIGRlIGxvcyBjdWFsZXMgc2UgdGllbmUgaW5mb3JtYWNpw7NuIHNvYnJlIGVsIE51bWVybyBkZSBBY2VzbywgU2Vyb3RpcG8sIGdlbm90aXBvLCBhc2kgY29tbyBlbCBwYWlzLCBsb2NhbGlkYWQgKGNvb3JkZW5hZGFzKSB5IGHDsW8gZW4gcXVlIGZ1ZXJvbiByZXBvcnRhZG9zIGxvcyBjYXNvcy4KCiMjIyBTZXJvdGlwb3MgIyMjCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDYsZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIyBHRU5PTUEKCkQxX0cgPC0gbGVuZ3RoKEdlbm9tZVtHZW5vbWUkU2Vyb3R5cGU9PSJERU5WXzEiLDRdKQpEMl9HIDwtIGxlbmd0aChHZW5vbWVbR2Vub21lJFNlcm90eXBlPT0iREVOVl8yIiw0XSkKRDNfRyA8LSBsZW5ndGgoR2Vub21lW0dlbm9tZSRTZXJvdHlwZT09IkRFTlZfMyIsNF0pCkQ0X0cgPC0gbGVuZ3RoKEdlbm9tZVtHZW5vbWUkU2Vyb3R5cGU9PSJERU5WXzQiLDRdKQoKCmRhdGEgPC0gYyggRDFfRywgRDJfRywgRDNfRywgRDRfRykKCk5hbWVfc2Vyb3R5cGUgPC0gc29ydCh1bmlxdWUoR2Vub21lJFNlcm90eXBlKSkKCnNlcm90eXBlX2dlbm9tZSA8LSBkYXRhLmZyYW1lKGRhdGEsIE5hbWVfc2Vyb3R5cGUpCgojIEdFTiBFCgpEMV9FIDwtIGxlbmd0aChHZW5FW0dlbkUkU2Vyb3R5cGU9PSJERU5WXzEiLDRdKQpEMl9FIDwtIGxlbmd0aChHZW5FW0dlbkUkU2Vyb3R5cGU9PSJERU5WXzIiLDRdKQpEM19FIDwtIGxlbmd0aChHZW5FW0dlbkUkU2Vyb3R5cGU9PSJERU5WXzMiLDRdKQpENF9FIDwtIGxlbmd0aChHZW5FW0dlbkUkU2Vyb3R5cGU9PSJERU5WXzQiLDRdKQoKCmRhdGEgPC0gYyggRDFfRSwgRDJfRSwgRDNfRSwgRDRfRSkKCk5hbWVfc2Vyb3R5cGUgPC0gc29ydCh1bmlxdWUoR2VuRSRTZXJvdHlwZSkpCgpzZXJvdHlwZV9nZW5lIDwtIGRhdGEuZnJhbWUoZGF0YSwgTmFtZV9zZXJvdHlwZSkKCnR5cGUgPC0gYygiR2Vub21lIiwgIkdlbm9tZSIsICJHZW5vbWUiLCAiR2Vub21lIiwgIkdlbkUiLCAiR2VuRSIsICJHZW5FIiwgIkdlbkUiKQoKc2Vyb3R5cGUgPC0gcmJpbmQoc2Vyb3R5cGVfZ2Vub21lLHNlcm90eXBlX2dlbmUpCgpzZXJvdHlwZSA8LSBjYmluZChzZXJvdHlwZSx0eXBlKQoKbGlicmFyeSgiZ2dwbG90MiIpCgpnZ3Bsb3QoZGF0YSA9IHNlcm90eXBlLCBhZXMoeD1OYW1lX3Nlcm90eXBlICwgeSA9IGRhdGEsIGZpbGw9dHlwZSkpKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICBzY2FsZV9jb2xvdXJfYnJld2VyKCkrCiAgdGhlbWVfbWluaW1hbCgpCgpgYGAKKipGaWd1cmEgMi4qKiBGcmVjdWVuY2lhcyBkZSBsb3Mgc2Vyb3RpcG9zIHBhcmEgR2VuIEUgeSBHZW5vbWEuIExvcyBzZXJvdGlwb3MgZGUgbG9zIGNhc29zIGNvbiBHZW5vbWEgcHJlc2VudGFuIGVsIG1pc21vIHBhdHJvbiBxdWUgbG9zIHNlcm90aXBvcyBkZSB0b2RhIGxhIGJhc2UgZGUgZGF0b3MsIGRvbmRlIGVsIHNlcm90aXBvIDEgdGllbmUgbWF5b3IgZnJlY3VlbmNpYSBzZWd1aWRvIGRlbCBzZXJvdGlwbyAyLCAzIHkgNC4gUG9yIGVsIGNvbnRyYXJpbywgZW4gbG9zIGNhc29zIGNvbiBHZW4gRSBlbCBzZXJvdGlwbyA0IHRpZW5lIG1heW9yIGZyZWN1ZWNpYSBxdWUgZWwgc2Vyb3RpcG8gMy4KCgojIyMgUGFpc2VzIHBhcmEgZGF0b3MgY29uIEdlbm9tYSAjIyMKCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDgsZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKQ291bnRyeV9uYW1lcyA8LSB1bmlxdWUoR2Vub21lJENvdW50cnkpCgoKY291bnRyeS5nZW5vbWUgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChDb3VudHJ5X25hbWVzKSl7CiAgY291bnRyeS5nZW5vbWVbaSwiQ291bnRyeV9uYW1lcyJdIDwtIENvdW50cnlfbmFtZXNbaV0KICBjb3VudHJ5Lmdlbm9tZVtpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKEdlbm9tZVt3aGljaChHZW5vbWUkQ291bnRyeT09Q291bnRyeV9uYW1lc1tpXSksOF0pCiAgY291bnRyeS5nZW5vbWVbMTEsICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgod2hpY2goaXMubmEoR2Vub21lJENvdW50cnkpPT1UKSkKfQoKY291bnRyeS5nZW5vbWUgPC0gdHJhbnNmb3JtKGNvdW50cnkuZ2Vub21lLCBDb3VudHJ5X25hbWVzPSByZW9yZGVyKENvdW50cnlfbmFtZXMsICtudW1iZXJfY2FzZXMpKQoKZ2dwbG90KGRhdGEgPSBjb3VudHJ5Lmdlbm9tZSwgYWVzKHggPSBDb3VudHJ5X25hbWVzLCB5ID0gbnVtYmVyX2Nhc2VzLCBjb2xvcj1Db3VudHJ5X25hbWVzKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsPSJ3aGl0ZSIpKwogIGxhYnMoeD0gIkNvdW50cnkiLCB5PSAiRGF0YSBOdW1iZXIiKSsKICBzY2FsZV9jb2xvcl9ncmV5KHN0YXJ0PSAwLjcsIGVuZD0wLjEpKwogIHRoZW1lX2NsYXNzaWMoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSsKICBjb29yZF9mbGlwKCkKCmBgYAoqKkZpZ3VyYSAzLioqIFBhaXNlcyByZXBvcnRhZG9zIHBhcmEgY2Fzb3MgY29uIEdlbm9tYSBDb21wbGV0by4gRWwgcGFpcyBjb24gbWF5b3IgbnVtZXJvIGRlIGNhc29zIGVzIFZpZXROYW0gKDEwOTIgY2Fzb3MpLCBhbCBpZ3VhbCBxdWUgZW4gbGEgYmFzZSBkZSBkYXRvcyB0b3RhbC4gTHVlZ28gbGUgc2lndWVuIE5pY2FyYWd1YSwgUHVlcnRvIFJpY28geSBTaW5nYXB1ci4gQ2FiZSByZXNhbHRhciBxdWUgZW50cmUgbG9zIDEwIHBhaXNlcyBjb24gbWF5b3IgZnJlY3VhbmNpYSBzZSBlbmN1ZW50cmFuIDUgcGFpc2VzIGRlIEFtZXJpY2EgTGF0aW5hIChOaWNhcmFndWEoMiksIFB1ZXJ0byBSaWNvKDMpLCBWZW5lenVlbGEoNSksIEJyYXppbCg2KSwgTWV4aWNvKDgpKSB5IDUgcGFpc2VzIGRlIEFzaWEgKFZpZXROYW0oMSksIFNpbmdhcHVyKDQpLCBDYW1ib2RpYSg3KSwgVGFpbGFuZGlhKDkpLCBJbmRvbmVzaWEoMTApKQoKIyMjIFBhaXNlcyBwYXJhIGRhdG9zIGNvbiBHZW4gRSAjIyMKCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDEwLGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCkNvdW50cnlfbmFtZXMgPC0gdW5pcXVlKEdlbkUkQ291bnRyeSkKCgpjb3VudHJ5LmdlbmUgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChDb3VudHJ5X25hbWVzKSl7CiAgY291bnRyeS5nZW5lW2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgY291bnRyeS5nZW5lW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgoR2VuRVt3aGljaChHZW5FJENvdW50cnk9PUNvdW50cnlfbmFtZXNbaV0pLDhdKQogIGNvdW50cnkuZ2VuZVsyOCwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aCh3aGljaChpcy5uYShHZW5FJENvdW50cnkpPT1UKSkKfQoKY291bnRyeS5nZW5lIDwtIHRyYW5zZm9ybShjb3VudHJ5LmdlbmUsIENvdW50cnlfbmFtZXM9IHJlb3JkZXIoQ291bnRyeV9uYW1lcywgK251bWJlcl9jYXNlcykpCgpnZ3Bsb3QoZGF0YSA9IGNvdW50cnkuZ2VuZSwgYWVzKHggPSBDb3VudHJ5X25hbWVzLCB5ID0gbnVtYmVyX2Nhc2VzLCBjb2xvcj1Db3VudHJ5X25hbWVzKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsPSJ3aGl0ZSIpKwogIGxhYnMoeD0gIkNvdW50cnkiLCB5PSAiRGF0YSBOdW1iZXIiKSsKICBzY2FsZV9jb2xvcl9ncmV5KHN0YXJ0PSAwLjcsIGVuZD0wLjEpKwogIHRoZW1lX2NsYXNzaWMoKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSsKICBjb29yZF9mbGlwKCkKCmBgYAoqKkZpZ3VyYSA0LioqIFBhaXNlcyByZXBvcnRhZG9zIHBhcmEgY2Fzb3MgY29uIEdlbiBFLiBFbCBwYWlzIGNvbiBtYXlvciBudW1lcm8gZGUgY2Fzb3MgZXMgU2luZ2FwdXIgKDc1MCBjYXNvcyksIHNlZ3VpZG8gZGUgVGFpbGFuZGlhICg3MjUgY2Fzb3MpIHkgQ2hpbmEgKDY3MikuIEVudHJlIGxvcyAxMCBwYWlzZXMgY29uIG1heW9yIGZyZWN1YW5jaWEgc2UgZW5jdWVudHJhbiAyIHBhaXNlcyBkZSBBbWVyaWNhIExhdGluYSAoQnJhemlsKDUpLCBNZXhpY28oMTApKSwgMiBpc2xhcyAoRnJlbmNoIFBvbHluZXNpYSg4KSwgTnVldmEgQ2FsZWRvbmlhKDkpKSB5IDYgcGFpc2VzIGRlIEFzaWEgKFNpbmdhcHVyKDEpLCBUYWlsYW5kaWEoMiksIENoaW5hICgzKSwgVmlldE5hbSg0KSwgSW5kb25lc2lhKDYpLCBNYWxhc2lhKDcpKS4KCgojIyMgTWFwYS1NdW5kaTogTnVtZXJvIGRlIGNhc29zIHJlcG9ydGFkb3MgcG9yIHBhaXNlcyAgIyMjCgpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxMixlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgRnJlY3VlbmNpYSBkZSBsb3MgcGFpc2VzIGNvbiBzdXMgcmVzcGVjdGl2YXMgY29vcmRlbmFkYXMKIyBTSU4gRElTQ1JJTU1JTkFSIFBPUiBTRVJPVElQT1MKCmxpYnJhcnkocndvcmxkbWFwKQpsaWJyYXJ5KGdncGxvdDIpCgojIEdFTk9NQQoKQ291bnRyeV9uYW1lcyA8LSB1bmlxdWUoR2Vub21lJENvdW50cnkpCgpmcmVnLmNvdW50cnkgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChDb3VudHJ5X25hbWVzKSl7CiAgZnJlZy5kYXRhIDwtIEdlbm9tZVt3aGljaChHZW5vbWUkQ291bnRyeSA9PSBDb3VudHJ5X25hbWVzW2ldKSxdCiAgZnJlZy5jb3VudHJ5W2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgZnJlZy5jb3VudHJ5W2ksImxhdCJdIDwtIGZyZWcuZGF0YSRsYXRfY291bnRyeVsxXQogIGZyZWcuY291bnRyeVtpLCJsb24iXSA8LSBmcmVnLmRhdGEkbG9uX2NvdW50cnlbMV0KICBmcmVnLmNvdW50cnlbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChmcmVnLmRhdGEkQ291bnRyeSkKfQoKZnJlZy5jb3VudHJ5IDwtIG5hLm9taXQoZnJlZy5jb3VudHJ5KQoKIyBHUkFGSUNBIE1BUEEtTVVOREkgU0lOIERJRkVSRU5DSUFETyBQT1IgU0VST1RJUE9TCgptYXAud29ybGQgPC0gbWFwX2RhdGEobWFwPSJ3b3JsZCIpCgpwIDwtIGdncGxvdCgpKyAKICAjdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgZ2VvbV9tYXAoZGF0YT1tYXAud29ybGQsIG1hcD1tYXAud29ybGQsIGFlcyhtYXBfaWQ9cmVnaW9uLCB4PWxvbmcsIHk9bGF0KSwgZmlsbD0id2hpdGUiLCBjb2xvdXI9ImJsYWNrIiwgc2l6ZT0wLjUpKwogIGdlb21fcG9pbnQoZGF0YT0gZnJlZy5jb3VudHJ5LCBhZXMoeD1sb24sIHk9bGF0LCBzaXplPW51bWJlcl9jYXNlcyksIGNvbG9yPSJjb3JhbDEiICwgYWxwaGE9MC41KSsKICBnZ3RpdGxlKCJHZW5vbWEiKSsKICBzY2FsZV9zaXplKG5hbWU9Ik51bWJlciBvZiBjYXNlcyIpCgojIEdFTiBFIAoKCkNvdW50cnlfbmFtZXMgPC0gdW5pcXVlKEdlbkUkQ291bnRyeSkKCmZyZWUuY291bnRyeSA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXMpKXsKICBmcmVlLmRhdGEgPC0gR2VuRVt3aGljaChHZW5FJENvdW50cnkgPT0gQ291bnRyeV9uYW1lc1tpXSksXQogIGZyZWUuY291bnRyeVtpLCJDb3VudHJ5X25hbWVzIl0gPC0gQ291bnRyeV9uYW1lc1tpXQogIGZyZWUuY291bnRyeVtpLCJsYXQiXSA8LSBmcmVlLmRhdGEkbGF0X2NvdW50cnlbMV0KICBmcmVlLmNvdW50cnlbaSwibG9uIl0gPC0gZnJlZS5kYXRhJGxvbl9jb3VudHJ5WzFdCiAgZnJlZS5jb3VudHJ5W2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgoZnJlZS5kYXRhJENvdW50cnkpCn0KCmZyZWUuY291bnRyeSA8LSBuYS5vbWl0KGZyZWUuY291bnRyeSkKCiMgR1JBRklDQSBNQVBBLU1VTkRJIFNJTiBESUZFUkVOQ0lBRE8gUE9SIFNFUk9USVBPUwoKbWFwLndvcmxkIDwtIG1hcF9kYXRhKG1hcD0id29ybGQiKQoKcDEgPC0gZ2dwbG90KCkrIAogICN0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSsKICBnZW9tX21hcChkYXRhPW1hcC53b3JsZCwgbWFwPW1hcC53b3JsZCwgYWVzKG1hcF9pZD1yZWdpb24sIHg9bG9uZywgeT1sYXQpLCBmaWxsPSJ3aGl0ZSIsIGNvbG91cj0iYmxhY2siLCBzaXplPTAuNSkrCiAgZ2VvbV9wb2ludChkYXRhPSBmcmVlLmNvdW50cnksIGFlcyh4PWxvbiwgeT1sYXQsIHNpemU9bnVtYmVyX2Nhc2VzKSwgY29sb3I9ImNvcmFsMSIgLCBhbHBoYT0wLjUpKwogIGdndGl0bGUoIkdlbiBFIikrCiAgc2NhbGVfc2l6ZShuYW1lPSJOdW1iZXIgb2YgY2FzZXMiKQoKCm11bHRpcGxvdCA8LSBmdW5jdGlvbiguLi4sIHBsb3RsaXN0PU5VTEwsIGZpbGUsIGNvbHM9MSwgbGF5b3V0PU5VTEwpIHsKICBsaWJyYXJ5KGdyaWQpCgogICMgTWFrZSBhIGxpc3QgZnJvbSB0aGUgLi4uIGFyZ3VtZW50cyBhbmQgcGxvdGxpc3QKICBwbG90cyA8LSBjKGxpc3QoLi4uKSwgcGxvdGxpc3QpCgogIG51bVBsb3RzID0gbGVuZ3RoKHBsb3RzKQoKICAjIElmIGxheW91dCBpcyBOVUxMLCB0aGVuIHVzZSAnY29scycgdG8gZGV0ZXJtaW5lIGxheW91dAogIGlmIChpcy5udWxsKGxheW91dCkpIHsKICAgICMgTWFrZSB0aGUgcGFuZWwKICAgICMgbmNvbDogTnVtYmVyIG9mIGNvbHVtbnMgb2YgcGxvdHMKICAgICMgbnJvdzogTnVtYmVyIG9mIHJvd3MgbmVlZGVkLCBjYWxjdWxhdGVkIGZyb20gIyBvZiBjb2xzCiAgICBsYXlvdXQgPC0gbWF0cml4KHNlcSgxLCBjb2xzICogY2VpbGluZyhudW1QbG90cy9jb2xzKSksCiAgICAgICAgICAgICAgICAgICAgbmNvbCA9IGNvbHMsIG5yb3cgPSBjZWlsaW5nKG51bVBsb3RzL2NvbHMpKQogIH0KCiBpZiAobnVtUGxvdHM9PTEpIHsKICAgIHByaW50KHBsb3RzW1sxXV0pCgogIH0gZWxzZSB7CiAgICAjIFNldCB1cCB0aGUgcGFnZQogICAgZ3JpZC5uZXdwYWdlKCkKICAgIHB1c2hWaWV3cG9ydCh2aWV3cG9ydChsYXlvdXQgPSBncmlkLmxheW91dChucm93KGxheW91dCksIG5jb2wobGF5b3V0KSkpKQoKICAgICMgTWFrZSBlYWNoIHBsb3QsIGluIHRoZSBjb3JyZWN0IGxvY2F0aW9uCiAgICBmb3IgKGkgaW4gMTpudW1QbG90cykgewogICAgICAjIEdldCB0aGUgaSxqIG1hdHJpeCBwb3NpdGlvbnMgb2YgdGhlIHJlZ2lvbnMgdGhhdCBjb250YWluIHRoaXMgc3VicGxvdAogICAgICBtYXRjaGlkeCA8LSBhcy5kYXRhLmZyYW1lKHdoaWNoKGxheW91dCA9PSBpLCBhcnIuaW5kID0gVFJVRSkpCgogICAgICBwcmludChwbG90c1tbaV1dLCB2cCA9IHZpZXdwb3J0KGxheW91dC5wb3Mucm93ID0gbWF0Y2hpZHgkcm93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dC5wb3MuY29sID0gbWF0Y2hpZHgkY29sKSkKICAgIH0KICB9Cn0KCgptdWx0aXBsb3QocCxwMSkKCmBgYAoqKkZpZ3VyYSA1LioqICBNYXBhLW11bmRpIGRlbCBudW1lcm8gZGUgY2Fzb3MgcmVwb3J0YWRvcyBlbiBjYWRhIHBhaXNlcy4gRW4gZXN0YSBncmFmaWNhIHNlIHB1ZWRlIGFwcmVjaWFyIHF1ZSBsYSBmcmVjdWVuY2lhIGRlIGxvcyBjYXNvcyBxdWUgcmVwb3J0YW4gZWwgR2Vub21hIGVzIGhvbW9nZW5lYSBlbnRyZSBsb3MgcGFpc2VzIGRlIEFtZXJpY2EgTGF0aW5hIHkgQXNpYSAoPiAyNTAgPCA1MDApLiBTaW4gZW1iYXJnbyBlcyBtdXkgbm90b3JpbyBxdWUgVmlldE5hbSB0aWVuZSBhbHRhIGZyZWN1ZW5jaWEgKCBhbHJlZGVkb3IgZGUgMTAwMCBjYXNvcykuIExvcyBjYXNvcyBxdWUgcmVwb3J0YW4gZWwgR2VuIEUgdGllbmUgZnJlY3VlbmNpYXMgbWFzIGhldGVyb2dlbmVhcyBwb3JxdWUgNCBwYWlzZXMgZGUgQXNpYSByZXBvcnRhbiBsYXMgZnJlY3VlbmNpYXMgbWFzIGFsdGFzICg+IDYwMCksIG1pZW50cmFzIHF1ZSBlbiBBbWVyaWNhIExhdGluYSBlbCBwYWlzIGNvbiBtYXlvciBudW1lcm8gZGUgY2Fzb3MgZXMgQnJhc2lsICg+IDQwMCA8IDYwMCksIGxvcyBkZW1hcyByZXBvcnRhbiBubyBtYXMgZGUgMjAwIGNhc29zLiBUYW50byBsb3MgY2Fzb3MgcXVlIHJlcG9ydGFuIEdlbm9tYSBjb21vIEdlbiBFIHRpZW5lIGJhamEgZnJlY3VlbmNpYXMgZW4gbG9zIHBhaXNlcyBhZnJpY2Fub3MgKDwgMjAwKSwgZXN0byB0YW1iaWVuIHNlIG9ic2VydmEgZW4gbGEgYmFzZSBkZSBkYXRvcyBjb21wbGV0YS4KCiMjIyBEaXN0cmlidWNpb24gZGUgbG9zIHNlcm90aXBvcyBwb3IgcGFpc2VzOiBDYXNvcyBxdWUgcmVwb3J0YW4gR2Vub21hICMjIwpgYGB7ciwgZWNobyA9IEZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCkNvdW50cnlfbmFtZXMgPC0gbmEub21pdCh1bmlxdWUoR2Vub21lJENvdW50cnkpKQoKIyBGcmVjdWVuY2lhIGRlIGxvcyBzZXJvdGlwb3MgZW4gbG9zIHBhaXNlcyByZWdpc3RyYWRvczogCgojIFNFUk9USVBPIDEKCm11bmRpZ18xIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIG1pbmkuZGF0YSA8LSBHZW5vbWVbd2hpY2goR2Vub21lJFNlcm90eXBlID09ICJERU5WXzEiICYgR2Vub21lJENvdW50cnkgPT0gQ291bnRyeV9uYW1lc1tpXSksXQogIG11bmRpZ18xW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIG11bmRpZ18xW2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgbXVuZGlnXzFbaSwibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9jb3VudHJ5WzFdCiAgbXVuZGlnXzFbaSwibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9jb3VudHJ5WzFdCiAgbXVuZGlnXzFbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkQ291bnRyeSkKfQoKI1NFUk9USVBPIDIKCm11bmRpZ18yIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIG1pbmkuZGF0YSA8LSBHZW5vbWVbd2hpY2goR2Vub21lJFNlcm90eXBlID09ICJERU5WXzIiICYgR2Vub21lJENvdW50cnkgPT0gQ291bnRyeV9uYW1lc1tpXSksXQogIG11bmRpZ18yW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIG11bmRpZ18yW2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgbXVuZGlnXzJbaSwibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9jb3VudHJ5WzFdCiAgbXVuZGlnXzJbaSwibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9jb3VudHJ5WzFdCiAgbXVuZGlnXzJbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkQ291bnRyeSkKfQoKI1NFUk9USVBPIDMKCm11bmRpZ18zIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIG1pbmkuZGF0YSA8LSBHZW5vbWVbd2hpY2goR2Vub21lJFNlcm90eXBlID09ICJERU5WXzMiICYgR2Vub21lJENvdW50cnkgPT0gQ291bnRyeV9uYW1lc1tpXSksXQogIG11bmRpZ18zW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIG11bmRpZ18zW2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgbXVuZGlnXzNbaSwibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9jb3VudHJ5WzFdCiAgbXVuZGlnXzNbaSwibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9jb3VudHJ5WzFdCiAgbXVuZGlnXzNbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkQ291bnRyeSkKfQoKI1NFUk9USVBPIDQKCm11bmRpZ180IDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIG1pbmkuZGF0YSA8LSBHZW5vbWVbd2hpY2goR2Vub21lJFNlcm90eXBlID09ICJERU5WXzQiICYgR2Vub21lJENvdW50cnkgPT0gQ291bnRyeV9uYW1lc1tpXSksXQogIG11bmRpZ180W2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIG11bmRpZ180W2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgbXVuZGlnXzRbaSwibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9jb3VudHJ5WzFdCiAgbXVuZGlnXzRbaSwibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9jb3VudHJ5WzFdCiAgbXVuZGlnXzRbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkQ291bnRyeSkKfQoKCmRhdGEubXVuZGkgPC0gcmJpbmQobXVuZGlnXzEsbXVuZGlnXzIsbXVuZGlnXzMsbXVuZGlnXzQpCmRhdGEubXVuZGkgPC0gbmEub21pdChkYXRhLm11bmRpKQoKIyBHUkFGSUNBIE1BUEEtTVVOREkgRElGRVJFTkNJQURPIFBPUiBTRVJPVElQT1MKCm1hcC53b3JsZCA8LSBtYXBfZGF0YShtYXA9IndvcmxkIikKCmdncGxvdCgpKyAKICBnZW9tX21hcChkYXRhPW1hcC53b3JsZCwgbWFwPW1hcC53b3JsZCwgYWVzKG1hcF9pZD1yZWdpb24sIHg9bG9uZywgeT1sYXQpLCBmaWxsPSJ3aGl0ZSIsIGNvbG91cj0iYmxhY2siLCBzaXplPTAuNSkrCiAgZ2d0aXRsZSgiUGFpc2VzIHJlcG9ydGFkYXMgcGFyYSBHZW5vbWEiKSsKICBnZW9tX3BvaW50KGRhdGE9IGRhdGEubXVuZGksIGFlcyh4PWxvbiwgeT1sYXQsIGNvbG9yPVNlcm90eXBlKSxzaXplPTEuNSwgYWxwaGE9MC41KSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoInR1cnF1b2lzZTMiLCJkZWVwcGluayIsIm1lZGl1bWJsdWUiLCJncmVlbjMiKSkKCgpgYGAKKipGaWd1cmEgNi4qKiBMb3Mgc2Vyb3RpcG9zIGRlIGxvcyBjYXNvcyBxdWUgcmVwb3J0YW4gZWwgR2Vub21hIHNlIGRpc3RyaWJ1eWVuIHBvciB0b2RhIGxhIHJlZ2lvbiB0cm9waWNhbCB5IHN1YnRyb3BpY2FsLgoKCiMjIyBQYWlzZXMgcmVwb3J0YWRvcyBlbiBjYXNvcyBjb24gR2VuIEUgIyMjCmBgYHtyLCBlY2hvID0gRkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKQ291bnRyeV9uYW1lcyA8LSBuYS5vbWl0KHVuaXF1ZShHZW5FJENvdW50cnkpKQoKIyBGcmVjdWVuY2lhIGRlIGxvcyBzZXJvdGlwb3MgZW4gbG9zIHBhaXNlcyByZWdpc3RyYWRvczogCgojIFNFUk9USVBPIDEKCm11bmRpZV8xIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIG1pbmkuZGF0YSA8LSBHZW5FW3doaWNoKEdlbkUkU2Vyb3R5cGUgPT0gIkRFTlZfMSIgJiBHZW5FJENvdW50cnkgPT0gQ291bnRyeV9uYW1lc1tpXSksXQogIG11bmRpZV8xW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIG11bmRpZV8xW2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgbXVuZGllXzFbaSwibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9jb3VudHJ5WzFdCiAgbXVuZGllXzFbaSwibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9jb3VudHJ5WzFdCiAgbXVuZGllXzFbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkQ291bnRyeSkKfQoKI1NFUk9USVBPIDIKCm11bmRpZV8yIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIG1pbmkuZGF0YSA8LSBHZW5FW3doaWNoKEdlbkUkU2Vyb3R5cGUgPT0gIkRFTlZfMiIgJiBHZW5FJENvdW50cnkgPT0gQ291bnRyeV9uYW1lc1tpXSksXQogIG11bmRpZV8yW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIG11bmRpZV8yW2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgbXVuZGllXzJbaSwibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9jb3VudHJ5WzFdCiAgbXVuZGllXzJbaSwibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9jb3VudHJ5WzFdCiAgbXVuZGllXzJbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkQ291bnRyeSkKfQoKCgojU0VST1RJUE8gMwoKbXVuZGllXzMgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aChDb3VudHJ5X25hbWVzKSl7CiAgbWluaS5kYXRhIDwtIEdlbkVbd2hpY2goR2VuRSRTZXJvdHlwZSA9PSAiREVOVl8zIiAmIEdlbkUkQ291bnRyeSA9PSBDb3VudHJ5X25hbWVzW2ldKSxdCiAgbXVuZGllXzNbaSwgIlNlcm90eXBlIl0gPC0gbWluaS5kYXRhJFNlcm90eXBlWzFdCiAgbXVuZGllXzNbaSwiQ291bnRyeV9uYW1lcyJdIDwtIENvdW50cnlfbmFtZXNbaV0KICBtdW5kaWVfM1tpLCJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2NvdW50cnlbMV0KICBtdW5kaWVfM1tpLCJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2NvdW50cnlbMV0KICBtdW5kaWVfM1tpLCAibnVtYmVyX2Nhc2VzIl0gPC0gbGVuZ3RoKG1pbmkuZGF0YSRDb3VudHJ5KQp9CgoKI1NFUk9USVBPIDQKCm11bmRpZV80IDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lcykpewogIG1pbmkuZGF0YSA8LSBHZW5FW3doaWNoKEdlbkUkU2Vyb3R5cGUgPT0gIkRFTlZfNCIgJiBHZW5FJENvdW50cnkgPT0gQ291bnRyeV9uYW1lc1tpXSksXQogIG11bmRpZV80W2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIG11bmRpZV80W2ksIkNvdW50cnlfbmFtZXMiXSA8LSBDb3VudHJ5X25hbWVzW2ldCiAgbXVuZGllXzRbaSwibGF0Il0gPC0gbWluaS5kYXRhJGxhdF9jb3VudHJ5WzFdCiAgbXVuZGllXzRbaSwibG9uIl0gPC0gbWluaS5kYXRhJGxvbl9jb3VudHJ5WzFdCiAgbXVuZGllXzRbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkQ291bnRyeSkKfQoKCgoKZGF0YS5tdW5kaSA8LSByYmluZChtdW5kaWVfMSxtdW5kaWVfMixtdW5kaWVfMyxtdW5kaWVfNCkKZGF0YS5tdW5kaSA8LSBuYS5vbWl0KGRhdGEubXVuZGkpCgojIEdSQUZJQ0EgTUFQQS1NVU5ESSBESUZFUkVOQ0lBRE8gUE9SIFNFUk9USVBPUwoKbWFwLndvcmxkIDwtIG1hcF9kYXRhKG1hcD0id29ybGQiKQoKZ2dwbG90KCkrIAogIGdlb21fbWFwKGRhdGE9bWFwLndvcmxkLCBtYXA9bWFwLndvcmxkLCBhZXMobWFwX2lkPXJlZ2lvbiwgeD1sb25nLCB5PWxhdCksIGZpbGw9IndoaXRlIiwgY29sb3VyPSJibGFjayIsIHNpemU9MC41KSsKICBnZ3RpdGxlKCJQYWlzZXMgcmVwb3J0YWRhcyBwYXJhIEdlbiBFIikrCiAgZ2VvbV9wb2ludChkYXRhPSBkYXRhLm11bmRpLCBhZXMoeD1sb24sIHk9bGF0LCBjb2xvcj1TZXJvdHlwZSksc2l6ZT0xLjUsIGFscGhhPTAuNSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJ0dXJxdW9pc2UzIiwiZGVlcHBpbmsiLCJtZWRpdW1ibHVlIiwiZ3JlZW4zIikpCgoKYGBgCioqRmlndXJhIDcuKiogTG9zIHNlcm90aXBvcyBkZSBsb3MgY2Fzb3MgcXVlIHJlcG9ydGFuIGVsIEdlbiBFIHNlIGRpc3RyaWJ1eWVuIHBvciB0b2RhIGxhIHJlZ2lvbiB0cm9waWNhbCB5IHN1YnRyb3BpY2FsLgoKCgojIyMgTG9jYWxpZGFkZXM6IEdlbm9tYSAjIyMKCmBgYHtyLCBlY2hvID0gRkFMU0UsIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpsaWJyYXJ5KHRtKQpsaWJyYXJ5KFNub3diYWxsQykKbGlicmFyeSh3b3JkY2xvdWQpCmxpYnJhcnkoIlJDb2xvckJyZXdlciIpCgpsb2NhdGlvbiA8LSBHZW5vbWVbd2hpY2goaXMubmEoR2Vub21lJExvY2F0aW9uKT09RiksOV0KCmxvY2F0aW9uIDwtIGdzdWIoIiAiLCAiIiwgbG9jYXRpb24pCgpsb2NvcnB1cyA8LSBDb3JwdXMoVmVjdG9yU291cmNlKGxvY2F0aW9uKSkKCnRvU3BhY2UgPC0gY29udGVudF90cmFuc2Zvcm1lcihmdW5jdGlvbiAoeCAsIHBhdHRlcm4gKSBnc3ViKHBhdHRlcm4sICIgIiwgeCkpCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgdG9TcGFjZSwgIi8iKQpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHRvU3BhY2UsICItIikKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCB0b1NwYWNlLCAiLS0iKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCByZW1vdmVOdW1iZXJzKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCdlbmdsaXNoJykpCgpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHJlbW92ZVdvcmRzLCBjKCJibGFibGExIiwgImJsYWJsYTIiKSkgCgpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHJlbW92ZVB1bmN0dWF0aW9uKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCBzdHJpcFdoaXRlc3BhY2UpCgpkdG0gPC0gVGVybURvY3VtZW50TWF0cml4KGxvY29ycHVzKQpsb21heCA8LSBhcy5tYXRyaXgoZHRtKQp2Y2F0aW9uIDwtIHNvcnQocm93U3Vtcyhsb21heCksZGVjcmVhc2luZz1UUlVFKQpsb2ZyYW1lIDwtIGRhdGEuZnJhbWUod29yZCA9IG5hbWVzKHZjYXRpb24pLGZyZXE9dmNhdGlvbikKCgojc2V0LnNlZWQoMTIzNCkKI3dvcmRjbG91ZCh3b3JkcyA9IGxvZnJhbWUkd29yZCwgZnJlcSA9IGxvZnJhbWUkZnJlcSwgc2NhbGUgPSBjKDQsLjUpLCBtaW4uZnJlcSA9IDIsCiMgICAgICAgICAgbWF4LndvcmRzPTIwMDAsIHJhbmRvbS5vcmRlcj1GQUxTRSwgcm90LnBlcj0wLjM1LAojICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDExLCAiUmRZbEduIikpCgoKd29yZGNsb3VkKHdvcmRzID0gbG9mcmFtZSR3b3JkLCBmcmVxID0gbG9mcmFtZSRmcmVxLCBzY2FsZSA9IGMoNCwxKSwgbWluLmZyZXEgPSAyLAogICAgICAgICAgbWF4LndvcmRzPTIwMDAsIHJhbmRvbS5vcmRlcj1GQUxTRSwgcm90LnBlcj0wLjQ1LAogICAgICAgICAgY29sb3JzPWJyZXdlci5wYWwoMTIsICJQYWlyZWQiKSkKCgpgYGAKKipGaWd1cmEgOC4qKiBOdWJlIGRlIGxvY2FsaWRhZGVzIHBhcmEgY2Fzb3MgcXVlIHJlcG9ydGFuIGVsIEdlbm9tYS4gTGFzIGxvY2FsaWRhZGVzIHF1ZSBtYXMgZXN0YW4gcmVwb3J0YWRhcyBwZXJ0ZW5lY2VuIGEgVmlldE5hbSAoU3VyIGRlIFZpZXRuYW0gY29uIDEwOTIgY2Fzb3MgcmVwcmVzZW50YW5kbyBjYXNpIGxhIHRvdGFsaWRhZCBkZSBjYXNvcyBxdWUgcmVwb3J0YSBlc3RlIHBhw61zKSwgQ2FtYmlkaWEgKEtDSCBjb24gMTE1KSwgTmljYXJhZ3VhIChNYW5hZ3VhIGNvbiAzMjMgY2Fzb3MpLCB5ICBWZW5lenVlbGEgKEFyYWd1YSBjb24gMTkyIGNhc29zKS4gCgoKIyMjIExvY2FsaWRhZGVzOiBHZW4gRSMjIwpgYGB7ciwgZWNobyA9IEZBTFNFLCBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD01fQoKbG9jYXRpb24gPC0gR2VuRVt3aGljaChpcy5uYShHZW5FJExvY2F0aW9uKT09RiksOV0KCmxvY2F0aW9uIDwtIGdzdWIoIiAiLCAiIiwgbG9jYXRpb24pCgpsb2NvcnB1cyA8LSBDb3JwdXMoVmVjdG9yU291cmNlKGxvY2F0aW9uKSkKCnRvU3BhY2UgPC0gY29udGVudF90cmFuc2Zvcm1lcihmdW5jdGlvbiAoeCAsIHBhdHRlcm4gKSBnc3ViKHBhdHRlcm4sICIgIiwgeCkpCmxvY29ycHVzIDwtIHRtX21hcChsb2NvcnB1cywgdG9TcGFjZSwgIi8iKQpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHRvU3BhY2UsICItIikKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCB0b1NwYWNlLCAiLS0iKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCByZW1vdmVOdW1iZXJzKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCdlbmdsaXNoJykpCgpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHJlbW92ZVdvcmRzLCBjKCJibGFibGExIiwgImJsYWJsYTIiKSkgCgpsb2NvcnB1cyA8LSB0bV9tYXAobG9jb3JwdXMsIHJlbW92ZVB1bmN0dWF0aW9uKQoKbG9jb3JwdXMgPC0gdG1fbWFwKGxvY29ycHVzLCBzdHJpcFdoaXRlc3BhY2UpCgpkdG0gPC0gVGVybURvY3VtZW50TWF0cml4KGxvY29ycHVzKQpsb21heCA8LSBhcy5tYXRyaXgoZHRtKQp2Y2F0aW9uIDwtIHNvcnQocm93U3Vtcyhsb21heCksZGVjcmVhc2luZz1UUlVFKQpsb2ZyYW1lIDwtIGRhdGEuZnJhbWUod29yZCA9IG5hbWVzKHZjYXRpb24pLGZyZXE9dmNhdGlvbikKCgojc2V0LnNlZWQoMTIzNCkKI3dvcmRjbG91ZCh3b3JkcyA9IGxvZnJhbWUkd29yZCwgZnJlcSA9IGxvZnJhbWUkZnJlcSwgc2NhbGUgPSBjKDQsLjUpLCBtaW4uZnJlcSA9IDIsCiMgICAgICAgICAgbWF4LndvcmRzPTIwMDAsIHJhbmRvbS5vcmRlcj1GQUxTRSwgcm90LnBlcj0wLjM1LAojICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDExLCAiUmRZbEduIikpCgoKd29yZGNsb3VkKHdvcmRzID0gbG9mcmFtZSR3b3JkLCBmcmVxID0gbG9mcmFtZSRmcmVxLCBzY2FsZSA9IGMoNCwxKSwgbWluLmZyZXEgPSAyLAogICAgICAgICAgbWF4LndvcmRzPTIwMDAsIHJhbmRvbS5vcmRlcj1GQUxTRSwgcm90LnBlcj0wLjQ1LAogICAgICAgICAgY29sb3JzPWJyZXdlci5wYWwoOCwgIlBhaXJlZCIpKQoKCmBgYAoqKkZpZ3VyYSA5LioqIE51YmUgZGUgbG9jYWxpZGFkZXMgcGFyYSBjYXNvcyBxdWUgcmVwb3J0YW4gZWwgR2VuIEUuIExhcyBsb2NhbGlkYWRlcyBxdWUgbWFzIGVzdGFuIHJlcG9ydGFkYXMgcGVydGVuZWNlbiBhIFRhaWxhbmRpYSAoQmFuZ2tvayBjb24gMjY1IGNhc29zLCBrYW1waGFlbmdwaGV0IGNvbiAxMjEgY2Fzb3MpLCBDaGluYSAoR3Vhbmd6aG91IGNvbiA4NiBjYXNvcyksIEZyZW5jaCBQb2x5bmVzaWEgKFRhaGl0aSBjb24gNzkgY2Fzb3MpLCBWaWV0TmFtIChNZWtvbmcgRGVsdGEgY29uIDU2IGNhc29zKSwgZSBJbmRvbmVzaWEgKEJhbGkgY29uIDU5IGNhc29zLCBTdXJhYmF5YSBjb24gNTcgY2Fzb3MpLiBUb2RvcyBwYWlzZXMgYXNpYXRpY29zLgoKIyMjIE1hcGEtTXVuZGkgbG9jYWxpZGFkZXMjIyMKYGBge3IsIGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTYsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cgpsb2NhdGlvbiA8LSB3aGljaChpcy5uYShHZW5vbWUkTG9jYXRpb24pPT1GKQoKbmFtZXNfbG9jYXRpb24gPC0gdW5pcXVlKEdlbm9tZVt3aGljaChpcy5uYShHZW5vbWUkTG9jYXRpb24pPT1GKSw5XSkKCmxvY2F0aW9uX2NvdW50cnlfYWxsIDwtIHZlY3RvcigpCgpmb3IoaSBpbiAxOmxlbmd0aChsb2NhdGlvbikpewogIGxvY2F0aW9uX2NvdW50cnlfYWxsW2ldIDwtICBwYXN0ZShHZW5vbWUkTG9jYXRpb25bbG9jYXRpb25baV1dLCIsIixHZW5vbWUkQ291bnRyeVtsb2NhdGlvbltpXV0sIHNlcCA9ICIiKQp9CgoKbG9jYXRpb25fY291bnRyeSA8LSB1bmlxdWUobG9jYXRpb25fY291bnRyeV9hbGwpCgojIFNFUk9USVBPIDEKClNHMSA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKG5hbWVzX2xvY2F0aW9uKSl7CiAgbWluaS5kYXRhIDwtIEdlbm9tZVt3aGljaChHZW5vbWUkU2Vyb3R5cGU9PSJERU5WXzEiICYgR2Vub21lJExvY2F0aW9uPT1uYW1lc19sb2NhdGlvbltpXSksXQogIFNHMVtpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBTRzFbaSwibG9jYXRpb25fbmFtZXMiXSA8LSBsb2NhdGlvbl9jb3VudHJ5W2ldCiAgU0cxW2ksICJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2xvY2F0aW9uWzFdCiAgU0cxW2ksICJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2xvY2F0aW9uWzFdCiAgU0cxW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJExvY2F0aW9uKQp9CgpTRzEgPC0gbmEub21pdChTRzEpCgojIFNFUk9USVBPIDIKClNHMiA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKG5hbWVzX2xvY2F0aW9uKSl7CiAgbWluaS5kYXRhIDwtIEdlbm9tZVt3aGljaChHZW5vbWUkU2Vyb3R5cGU9PSJERU5WXzIiICYgR2Vub21lJExvY2F0aW9uPT1uYW1lc19sb2NhdGlvbltpXSksXQogIFNHMltpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBTRzJbaSwibG9jYXRpb25fbmFtZXMiXSA8LSBsb2NhdGlvbl9jb3VudHJ5W2ldCiAgU0cyW2ksICJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2xvY2F0aW9uWzFdCiAgU0cyW2ksICJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2xvY2F0aW9uWzFdCiAgU0cyW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJExvY2F0aW9uKQp9CgpTRzIgPC0gbmEub21pdChTRzIpCgojIFNFUk9USVBFIDMKClNHMyA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKG5hbWVzX2xvY2F0aW9uKSl7CiAgbWluaS5kYXRhIDwtIEdlbm9tZVt3aGljaChHZW5vbWUkU2Vyb3R5cGU9PSJERU5WXzMiICYgR2Vub21lJExvY2F0aW9uPT1uYW1lc19sb2NhdGlvbltpXSksXQogIFNHM1tpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBTRzNbaSwibG9jYXRpb25fbmFtZXMiXSA8LSBsb2NhdGlvbl9jb3VudHJ5W2ldCiAgU0czW2ksICJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2xvY2F0aW9uWzFdCiAgU0czW2ksICJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2xvY2F0aW9uWzFdCiAgU0czW2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJExvY2F0aW9uKQp9CgpTRzMgPC0gbmEub21pdChTRzMpCgojIFNFUk9USVBFIDQKClNHNCA8LSBkYXRhLmZyYW1lKCkKCmZvcihpIGluIDE6bGVuZ3RoKG5hbWVzX2xvY2F0aW9uKSl7CiAgbWluaS5kYXRhIDwtIEdlbm9tZVt3aGljaChHZW5vbWUkU2Vyb3R5cGU9PSJERU5WXzQiICYgR2Vub21lJExvY2F0aW9uPT1uYW1lc19sb2NhdGlvbltpXSksXQogIFNHNFtpLCAiU2Vyb3R5cGUiXSA8LSBtaW5pLmRhdGEkU2Vyb3R5cGVbMV0KICBTRzRbaSwibG9jYXRpb25fbmFtZXMiXSA8LSBsb2NhdGlvbl9jb3VudHJ5W2ldCiAgU0c0W2ksICJsYXQiXSA8LSBtaW5pLmRhdGEkbGF0X2xvY2F0aW9uWzFdCiAgU0c0W2ksICJsb24iXSA8LSBtaW5pLmRhdGEkbG9uX2xvY2F0aW9uWzFdCiAgU0c0W2ksICJudW1iZXJfY2FzZXMiXSA8LSBsZW5ndGgobWluaS5kYXRhJExvY2F0aW9uKQp9CgpTRzQgPC0gbmEub21pdChTRzQpCgptdW5kaS5sb2NhdGlvbiA8LSByYmluZChTRzEsU0cyLFNHMyxTRzQpCgoKIyBHUkFGSUNBIE1BUEEtTVVOREkgRElGRVJFTkNJQURPIFBPUiBTRVJPVElQT1MKCm1hcC53b3JsZCA8LSBtYXBfZGF0YShtYXA9IndvcmxkIikKCmdncGxvdCgpKyAKICBnZW9tX21hcChkYXRhPW1hcC53b3JsZCwgbWFwPW1hcC53b3JsZCwgYWVzKG1hcF9pZD1yZWdpb24sIHg9bG9uZywgeT1sYXQpLCBmaWxsPSJ3aGl0ZSIsIGNvbG91cj0iYmxhY2siLCBzaXplPTAuNSkrCiAgZ2VvbV9wb2ludChkYXRhPSBtdW5kaS5sb2NhdGlvbiwgYWVzKHg9bG9uLCB5PWxhdCwgY29sb3I9U2Vyb3R5cGUpLHNpemU9MS41LCBhbHBoYT0wLjUpKwogIGdndGl0bGUoIkxvY2FsaWRhZXMgcmVwb3J0YWRhcyBwYXJhIEdlbm9tYSIpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygidHVycXVvaXNlMyIsImRlZXBwaW5rIiwibWVkaXVtYmx1ZSIsImdyZWVuMyIpKQoKCmBgYAoqKkZpZ3VyYSAxMC4qKiBEaXN0cmlidWNpw7NuIGRlIGxvcyBzZXJvdGlwb3MgcG9yIGxvY2FsaWRhZGVzIHBhcmEgY2Fzb3MgY29uIEdlbm9tYSBDb21wbGV0by4gRW4gY2FkYSBwYWlzIGRvbmRlIHNlIHJlcG9ydGFyb24gbG9zIGNhc29zIGhheSBwcmVzZW5jaWEgZGUgbG9zIDQgc2Vyb3RpcG9zLCBleGNlcHRvIGVuIFBlcnUsIGRvbmRlIHNvbG8gcHJlc2VudGEgc2Vyb3RpcG8gMiwgZW4gUGFyYWd1YXkgc29sbyBwcmVzZW50YSBzZXJvdGlwbyAzIHkgSmFwb24gc29sbyBwcmVzZW50YSBzZXJvdGlwbyAxLiAgCgoKIyMjIE1hcGEtbXVuZGkgbG9jYWxpZGFkZXMgR2VuIEUjIyMKYGBge3IsIGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTYsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cgpsb2NhdGlvbiA8LSB3aGljaChpcy5uYShHZW5FJExvY2F0aW9uKT09RikKCm5hbWVzX2xvY2F0aW9uIDwtIHVuaXF1ZShHZW5FW3doaWNoKGlzLm5hKEdlbkUkTG9jYXRpb24pPT1GKSw5XSkKCmxvY2F0aW9uX2NvdW50cnlfYWxsIDwtIHZlY3RvcigpCgpmb3IoaSBpbiAxOmxlbmd0aChsb2NhdGlvbikpewogIGxvY2F0aW9uX2NvdW50cnlfYWxsW2ldIDwtICBwYXN0ZShHZW5FJExvY2F0aW9uW2xvY2F0aW9uW2ldXSwiLCIsR2VuRSRDb3VudHJ5W2xvY2F0aW9uW2ldXSwgc2VwID0gIiIpCn0KCgpsb2NhdGlvbl9jb3VudHJ5IDwtIHVuaXF1ZShsb2NhdGlvbl9jb3VudHJ5X2FsbCkKCiMgU0VST1RJUE8gMQoKU0UxIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgobmFtZXNfbG9jYXRpb24pKXsKICBtaW5pLmRhdGEgPC0gR2VuRVt3aGljaChHZW5FJFNlcm90eXBlPT0iREVOVl8xIiAmIEdlbkUkTG9jYXRpb249PW5hbWVzX2xvY2F0aW9uW2ldKSxdCiAgU0UxW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIFNFMVtpLCJsb2NhdGlvbl9uYW1lcyJdIDwtIGxvY2F0aW9uX2NvdW50cnlbaV0KICBTRTFbaSwgImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfbG9jYXRpb25bMV0KICBTRTFbaSwgImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fbG9jYXRpb25bMV0KICBTRTFbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkTG9jYXRpb24pCn0KClNFMSA8LSBuYS5vbWl0KFNFMSkKCiMgU0VST1RJUE8gMgoKU0UyIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgobmFtZXNfbG9jYXRpb24pKXsKICBtaW5pLmRhdGEgPC0gR2VuRVt3aGljaChHZW5FJFNlcm90eXBlPT0iREVOVl8yIiAmIEdlbkUkTG9jYXRpb249PW5hbWVzX2xvY2F0aW9uW2ldKSxdCiAgU0UyW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIFNFMltpLCJsb2NhdGlvbl9uYW1lcyJdIDwtIGxvY2F0aW9uX2NvdW50cnlbaV0KICBTRTJbaSwgImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfbG9jYXRpb25bMV0KICBTRTJbaSwgImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fbG9jYXRpb25bMV0KICBTRTJbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkTG9jYXRpb24pCn0KClNFMiA8LSBuYS5vbWl0KFNFMikKCiMgU0VST1RJUEUgMwoKU0UzIDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgobmFtZXNfbG9jYXRpb24pKXsKICBtaW5pLmRhdGEgPC0gR2VuRVt3aGljaChHZW5FJFNlcm90eXBlPT0iREVOVl8zIiAmIEdlbkUkTG9jYXRpb249PW5hbWVzX2xvY2F0aW9uW2ldKSxdCiAgU0UzW2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIFNFM1tpLCJsb2NhdGlvbl9uYW1lcyJdIDwtIGxvY2F0aW9uX2NvdW50cnlbaV0KICBTRTNbaSwgImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfbG9jYXRpb25bMV0KICBTRTNbaSwgImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fbG9jYXRpb25bMV0KICBTRTNbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkTG9jYXRpb24pCn0KClNFMyA8LSBuYS5vbWl0KFNFMykKCiMgU0VST1RJUEUgNAoKU0U0IDwtIGRhdGEuZnJhbWUoKQoKZm9yKGkgaW4gMTpsZW5ndGgobmFtZXNfbG9jYXRpb24pKXsKICBtaW5pLmRhdGEgPC0gR2VuRVt3aGljaChHZW5FJFNlcm90eXBlPT0iREVOVl80IiAmIEdlbkUkTG9jYXRpb249PW5hbWVzX2xvY2F0aW9uW2ldKSxdCiAgU0U0W2ksICJTZXJvdHlwZSJdIDwtIG1pbmkuZGF0YSRTZXJvdHlwZVsxXQogIFNFNFtpLCJsb2NhdGlvbl9uYW1lcyJdIDwtIGxvY2F0aW9uX2NvdW50cnlbaV0KICBTRTRbaSwgImxhdCJdIDwtIG1pbmkuZGF0YSRsYXRfbG9jYXRpb25bMV0KICBTRTRbaSwgImxvbiJdIDwtIG1pbmkuZGF0YSRsb25fbG9jYXRpb25bMV0KICBTRTRbaSwgIm51bWJlcl9jYXNlcyJdIDwtIGxlbmd0aChtaW5pLmRhdGEkTG9jYXRpb24pCn0KClNFNCA8LSBuYS5vbWl0KFNFNCkKCm11bmRpLmxvY2F0aW9uIDwtIHJiaW5kKFNFMSxTRTIsU0UzLFNFNCkKCgojIEdSQUZJQ0EgTUFQQS1NVU5ESSBESUZFUkVOQ0lBRE8gUE9SIFNFUk9USVBPUwoKbWFwLndvcmxkIDwtIG1hcF9kYXRhKG1hcD0id29ybGQiKQoKZ2dwbG90KCkrIAogIGdlb21fbWFwKGRhdGE9bWFwLndvcmxkLCBtYXA9bWFwLndvcmxkLCBhZXMobWFwX2lkPXJlZ2lvbiwgeD1sb25nLCB5PWxhdCksIGZpbGw9IndoaXRlIiwgY29sb3VyPSJibGFjayIsIHNpemU9MC41KSsKICBnZW9tX3BvaW50KGRhdGE9IG11bmRpLmxvY2F0aW9uLCBhZXMoeD1sb24sIHk9bGF0LCBjb2xvcj1TZXJvdHlwZSksc2l6ZT0xLjUsIGFscGhhPTAuNSkrCiAgZ2d0aXRsZSgiTG9jYWxpZGFkZXMgcmVwb3J0YWRhcyBwYXJhIEdlbiBFIikrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJ0dXJxdW9pc2UzIiwiZGVlcHBpbmsiLCJtZWRpdW1ibHVlIiwiZ3JlZW4zIikpCgoKYGBgCioqRmlndXJhIDExLioqIERpc3RyaWJ1Y2nDs24gZGUgbG9zIHNlcm90aXBvcyBwb3IgbG9jYWxpZGFkZXMgcGFyYSBjYXNvcyBjb24gR2VuIEUuIEVuIGJyYXppbCBsb3MgY2Fzb3MgcmVwb3J0YWRvcyBzb24gc29sbyBkZWwgc2Vyb3RpcG8gMSwgZW4gY29sb21iaWEgc29uIHNvbG8gZGVsIHNlcm90aXBvIDQsIHkgZW4gZWN1YWRvciwgcGVydSwgYm9saXZpYSwgeSBwYXJhZ3VheSBzb24gZGVsIHNlcm90aXBvIDIgbG9zIGNhc29zIHF1ZSBzZSByZXBvcnRhIHN1IGxvY2FsaWRhZC4KCgoKIyMjIE1hcGEtbXVuZGkgZGUgbG9jYWxpZGFkZXMgcGFyYSBjYWRhIHNlcm9yaXBvICMjIwojIyMgR2Vub21hICMjIwpgYGB7ciwgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDIwLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgoKI1NHMQoKcDEgPC0gZ2dwbG90KCkrIAogIGdlb21fbWFwKGRhdGE9bWFwLndvcmxkLCBtYXA9bWFwLndvcmxkLCBhZXMoeD1sb25nLCB5PWxhdCxtYXBfaWQ9cmVnaW9uKSwgZmlsbD0id2hpdGUiLCBjb2xvdXI9ImJsYWNrIiwgc2l6ZT0wLjUpKwogIGdlb21fcG9pbnQoZGF0YT0gU0cxLCBhZXMoeD1sb24sIHk9bGF0KSxjb2xvcj0idHVycXVvaXNlMyIsIHNpemU9MS41LCBhbHBoYT0wLjUpKwogIGdndGl0bGUoIkRFTlYgMSIpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMCkKCiNTRzIKCnAyIDwtIGdncGxvdCgpKyAKICBnZW9tX21hcChkYXRhPW1hcC53b3JsZCwgbWFwPW1hcC53b3JsZCwgYWVzKHg9bG9uZywgeT1sYXQsbWFwX2lkPXJlZ2lvbiksIGZpbGw9IndoaXRlIiwgY29sb3VyPSJibGFjayIsIHNpemU9MC41KSsKICBnZW9tX3BvaW50KGRhdGE9IFNHMiwgYWVzKHg9bG9uLCB5PWxhdCksY29sb3I9ImRlZXBwaW5rIiwgc2l6ZT0xLjUsIGFscGhhPTAuNSkrCiAgZ2d0aXRsZSgiREVOViAyIikgKwogIGdlb21faml0dGVyKHdpZHRoID0gMTAsIGhlaWdodCA9IDEwKQoKI1NHMwoKcDMgPC0gZ2dwbG90KCkrIAogIGdlb21fbWFwKGRhdGE9bWFwLndvcmxkLCBtYXA9bWFwLndvcmxkLCBhZXMoeD1sb25nLCB5PWxhdCxtYXBfaWQ9cmVnaW9uKSwgZmlsbD0id2hpdGUiLCBjb2xvdXI9ImJsYWNrIiwgc2l6ZT0wLjUpKwogIGdlb21fcG9pbnQoZGF0YT0gU0czLCBhZXMoeD1sb24sIHk9bGF0KSxjb2xvcj0ibWVkaXVtYmx1ZSIsIHNpemU9MS41LCBhbHBoYT0wLjUpKwogIGdndGl0bGUoIkRFTlYgMyIpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMCkKCiNTRzQKCnA0IDwtIGdncGxvdCgpKyAKICBnZW9tX21hcChkYXRhPW1hcC53b3JsZCwgbWFwPW1hcC53b3JsZCwgYWVzKHg9bG9uZywgeT1sYXQsbWFwX2lkPXJlZ2lvbiksIGZpbGw9IndoaXRlIiwgY29sb3VyPSJibGFjayIsIHNpemU9MC41KSsKICBnZW9tX3BvaW50KGRhdGE9IFNHNCwgYWVzKHg9bG9uLCB5PWxhdCksY29sb3I9ImdyZWVuMyIsIHNpemU9MS41LCBhbHBoYT0wLjUpKwogIGdndGl0bGUoIkRFTlYgNCIpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMCkKCm11bHRpcGxvdChwMSwgcDIsIHAzLCBwNCwgY29scz0xKQoKYGBgCioqRmlndXJhIDEyLioqIERpc3RyaWJ1Y2nDs24gZGUgY2FkYSBzZXJvdGlwbyBlbiBsYXMgbG9jYWxpZGFkZXMgcmVwb3J0YWRhcyBwYXJhIGNhc29zIHF1ZSByZXBvcnRhbiBlbCBHZW5vbWEuCgoKIyMjIEdlbiBFICMjIwoKYGBge3IsIGZpZy53aWR0aCA9IDcsIGZpZy5oZWlnaHQgPSAyMCwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCiNTRTEKCnAxIDwtIGdncGxvdCgpKyAKICBnZW9tX21hcChkYXRhPW1hcC53b3JsZCwgbWFwPW1hcC53b3JsZCwgYWVzKHg9bG9uZywgeT1sYXQsbWFwX2lkPXJlZ2lvbiksIGZpbGw9IndoaXRlIiwgY29sb3VyPSJibGFjayIsIHNpemU9MC41KSsKICBnZW9tX3BvaW50KGRhdGE9IFNFMSwgYWVzKHg9bG9uLCB5PWxhdCksY29sb3I9InR1cnF1b2lzZTMiLCBzaXplPTEuNSwgYWxwaGE9MC41KSsKICBnZ3RpdGxlKCJERU5WIDEiKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAxMCwgaGVpZ2h0ID0gMTApCgojU0UyCgpwMiA8LSBnZ3Bsb3QoKSsgCiAgZ2VvbV9tYXAoZGF0YT1tYXAud29ybGQsIG1hcD1tYXAud29ybGQsIGFlcyh4PWxvbmcsIHk9bGF0LG1hcF9pZD1yZWdpb24pLCBmaWxsPSJ3aGl0ZSIsIGNvbG91cj0iYmxhY2siLCBzaXplPTAuNSkrCiAgZ2VvbV9wb2ludChkYXRhPSBTRTIsIGFlcyh4PWxvbiwgeT1sYXQpLGNvbG9yPSJkZWVwcGluayIsIHNpemU9MS41LCBhbHBoYT0wLjUpKwogIGdndGl0bGUoIkRFTlYgMiIpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMCkKCiNTRTMKCnAzIDwtIGdncGxvdCgpKyAKICBnZW9tX21hcChkYXRhPW1hcC53b3JsZCwgbWFwPW1hcC53b3JsZCwgYWVzKHg9bG9uZywgeT1sYXQsbWFwX2lkPXJlZ2lvbiksIGZpbGw9IndoaXRlIiwgY29sb3VyPSJibGFjayIsIHNpemU9MC41KSsKICBnZW9tX3BvaW50KGRhdGE9IFNFMywgYWVzKHg9bG9uLCB5PWxhdCksY29sb3I9Im1lZGl1bWJsdWUiLCBzaXplPTEuNSwgYWxwaGE9MC41KSsKICBnZ3RpdGxlKCJERU5WIDMiKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAxMCwgaGVpZ2h0ID0gMTApCgojU0U0CgpwNCA8LSBnZ3Bsb3QoKSsgCiAgZ2VvbV9tYXAoZGF0YT1tYXAud29ybGQsIG1hcD1tYXAud29ybGQsIGFlcyh4PWxvbmcsIHk9bGF0LG1hcF9pZD1yZWdpb24pLCBmaWxsPSJ3aGl0ZSIsIGNvbG91cj0iYmxhY2siLCBzaXplPTAuNSkrCiAgZ2VvbV9wb2ludChkYXRhPSBTRTQsIGFlcyh4PWxvbiwgeT1sYXQpLGNvbG9yPSJncmVlbjMiLCBzaXplPTEuNSwgYWxwaGE9MC41KSsKICBnZ3RpdGxlKCJERU5WIDQiKSArCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAxMCwgaGVpZ2h0ID0gMTApCgptdWx0aXBsb3QocDEsIHAyLCBwMywgcDQsIGNvbHM9MSkKCmBgYAoqKkZpZnVyYSAxMy4qKiBEaXN0cmlidWNpw7NuIGRlIGNhZGEgc2Vyb3RpcG8gZW4gbGFzIGxvY2FsaWRhZGVzIHJlcG9ydGFkYXMgcGFyYSBjYXNvcyBxdWUgcmVwb3J0YW4gZWwgR2VuIEUuCgoKIyMjIEHDsW9zIHBhcmEgZGF0b3MgcXVlIHJlcG9ydGFuIEdlbm9tYSAjIyMKCmBgYHtyLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDEwLCBlY2hvID0gRkFMU0V9CnllYXJzRyA8LSB1bmlxdWUoR2Vub21lJFllYXIpCgpjb3VudF95ZWFyc0cgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aCh5ZWFyc0cpKXsKICBjb3VudF95ZWFyc0dbaSwgIlllYXIiXSA8LSB5ZWFyc0dbaV0KICBjb3VudF95ZWFyc0dbaSwgIm51bWJlcl95ZWFyIl0gPC0gbGVuZ3RoKEdlbm9tZVt3aGljaChHZW5vbWUkWWVhcj09eWVhcnNHW2ldKSwxMF0pCiAgY291bnRfeWVhcnNHWzYsICJudW1iZXJfeWVhciJdIDwtIGxlbmd0aCh3aGljaChpcy5uYShHZW5vbWUkWWVhcik9PVQpKQp9Cgpjb3VudF95ZWFyc0cgPC0gdHJhbnNmb3JtKGNvdW50X3llYXJzRywgWWVhcj0gcmVvcmRlcihZZWFyLCAtbnVtYmVyX3llYXIpKQpnZ3Bsb3QoZGF0YSA9IGNvdW50X3llYXJzRywgYWVzKHggPSBZZWFyLCB5ID0gbnVtYmVyX3llYXIsIGNvbG9yPVllYXIpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGw9IndoaXRlIikrCiAgbGFicyh4PSAiWWVhciIsIHk9ICJEYXRhIE51bWJlciIpKwogIHNjYWxlX2NvbG9yX2dyZXkoc3RhcnQ9IDAuMSwgZW5kPTAuNykrCiAgdGhlbWVfY2xhc3NpYygpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIGNvb3JkX2ZsaXAoKQoKYGBgCioqRmlndXJhIDE0LioqIEHDsW9zIHJlZ2lzdHJhZG9zIHBhcmEgY2Fzb3MgY29uIEdlbm9tYS4gRWwgYcOxbyBtYXMgYW50aWd1byBxdWUgc2UgcmVwb3J0YSBlcyBlbCBhw7FvIDE2MDAgeSBlbCBtYXMgcmVjaWVudGUgZXMgMjAxNi4gRWwgYcOxbyAyMDA3IGVzIGVsIHF1ZSBzZSBoYSByZXBvcnRhZG8gbWFzIGNvbiA4MDUgY2Fzb3MuIEVuIGdlbmVyYWwsIGEgbWVkaWRhIHF1ZSBhdmFuemEgbG9zIGHDsW9zIHNlIGF1bWVudGEgZWwgbnVtZXJvIGRlIGNhc29zIHJlcG9ydGFkb3MgcGFyYSBjYWRhIGHDsW8uCgoKIyMjIEZyZWN1ZW5jaWEgZGUgbG9zIGHDsW9zIHJlcG9ydGFkb3MgcG9hIGNhZGEgcGFpczogR2Vub21hICMjIwpgYGB7ciwgZmlnLndpZHRoID0gMTgsIGZpZy5oZWlnaHQgPSAxMSwgZWNobyA9IEZBTFNFfQp5ZWFyc0cgPC0gbmEub21pdCh1bmlxdWUoR2Vub21lJFllYXIpKQoKQ291bnRyeV9uYW1lc0cgPC0gbmEub21pdCh1bmlxdWUoR2Vub21lJENvdW50cnkpKQoKI2RhdGEwNyA8LSBHZW5vbWVbd2hpY2goR2Vub21lJFllYXI9PTIwMDcpLF0KCkNvdW50cnlfeWVhciA8LSBkYXRhLmZyYW1lKCkKQ291bnRyeV95ZWFyX21hcyA8LSBkYXRhLmZyYW1lKCkKZm9yKGkgaW4gMTpsZW5ndGgoQ291bnRyeV9uYW1lc0cpKXsKICBmb3IoaiBpbiAxOmxlbmd0aCh5ZWFyc0cpKXsKICAgIGNvLmRhdGEgPC0gR2Vub21lW3doaWNoKEdlbm9tZSRDb3VudHJ5PT1Db3VudHJ5X25hbWVzR1tpXSAmIEdlbm9tZSRZZWFyPT15ZWFyc0dbal0pLGMoOCwxMCldCiAgICBDb3VudHJ5IDwtIGNvLmRhdGEkQ291bnRyeVsxXQogICAgWWVyYW5vIDwtIGNvLmRhdGEkWWVhclsxXQogICAgTnVtYmVyX2Nhc2VzIDwtIGxlbmd0aChjby5kYXRhJFllYXIpCiAgICBzdWJkYXRhIDwtIGNiaW5kKENvdW50cnksIFllcmFubywgTnVtYmVyX2Nhc2VzKQogICAgQ291bnRyeV95ZWFyIDwtIHJiaW5kKENvdW50cnlfeWVhcixzdWJkYXRhKQogIH0KICBDb3VudHJ5X3llYXJfbWFzIDwtIHJiaW5kKENvdW50cnlfeWVhcikKfQoKQ291bnRyeV95ZWFyX21hcyA8LSBuYS5vbWl0KENvdW50cnlfeWVhcl9tYXMpCgpDb3VudHJ5X3llYXJfbWFzJE51bWJlcl9jYXNlcyA8LSBhcy5jaGFyYWN0ZXIoQ291bnRyeV95ZWFyX21hcyROdW1iZXJfY2FzZXMpCkNvdW50cnlfeWVhcl9tYXMkTnVtYmVyX2Nhc2VzIDwtIGFzLm51bWVyaWMoQ291bnRyeV95ZWFyX21hcyROdW1iZXJfY2FzZXMpCgpDb3VudHJ5X3llYXJfbWFzJFllcmFubyA8LSBhcy5jaGFyYWN0ZXIoQ291bnRyeV95ZWFyX21hcyRZZXJhbm8pCkNvdW50cnlfeWVhcl9tYXMkWWVyYW5vIDwtIGFzLm51bWVyaWMoQ291bnRyeV95ZWFyX21hcyRZZXJhbm8pCgpDb3VudHJ5X3llYXJfbWFzIDwtIHRyYW5zZm9ybShDb3VudHJ5X3llYXJfbWFzLCBZZXJhbm89IHJlb3JkZXIoWWVyYW5vLCArWWVyYW5vKSkKCmdncGxvdChDb3VudHJ5X3llYXJfbWFzLCBhZXMoeD1ZZXJhbm8sIHk9Q291bnRyeSkpICsgCiAgZ2VvbV9wb2ludChhZXMoc2l6ZT1OdW1iZXJfY2FzZXMpKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQoKCmBgYAoqKkZpZ3VyYSAxNS4qKiBGcmVjdWVuY2lhIGRlIGxvcyBhw7FvcyByZXBvcnRhZG9zIHBhcmEgY2FkYSBwYWlzIGVuIGNhc29zIGNvbiBHZW5vbWEuIEFsZ3Vub3MgcGFpc2VzIHNvbG8gcmVwb3J0YW4gdW4gY2FzbyBlbiB1biBzb2xvIGHDsW8sIGNvbW8gZXMgZWwgY2FzbyBkZWwgc2FsdmFkb3IsIGxhb3MsIGUgaXNsYXMgY29tbyBHdWFtLCBHcmVuYWRhIGUgaXNsYXMgQ29vay4gU2luIGVtYmFyZ28gbGEgbWF5b3JpYSBkZSBsb3MgcGFpc2VzIGhhbiByZXBvcnRhZG8gbWFzIGRlIHVuIGNhc28gZW4gbWFzIGRlIHVuIGHDsW8uIENhYmUgcmVzYWx0YXIgcXVlIGRlIGxvcyBhbHJlZGVkb3IgZGUgODAwIGNhc29zIHF1ZSBzb24gcmVwb3J0YWRvcyBwYXJhIGVsIGHDsW8gMjAwNyAoKipGaWd1cmEgMTQuKiopLCBhbHJlZGVkb3IgZGUgbGEgbWl0YWQgKDQxMSkgcGVydGVuY2VuIGEgY2Fzb3MgZGUgVmlldE5hbS4gVGFtYmllbiBzZSBwdWVkZSBvYnNlcnZhciBxdWUgZW4gZ2VuZXJhbCBkZSBsb3MgMTA5MiBjYXNvcyBxdWUgcmVwb3J0YW4gYSBWaWV0TmFtICgqKkZpZ3VyYSAzKiopIGxhIG1heW9yaWEgcGVydGVuZWNlbiBhIGxvcyBhw7FvcyAyMDA2LCAyMDA3LCAyMDA4LgoKCiMjIyBBw7FvcyBwYXJhIGRhdG9zIHF1ZSByZXBvcnRhbiBHZW4gRSMjIwoKYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMTAsIGVjaG8gPSBGQUxTRX0KeWVhcnNFIDwtIHVuaXF1ZShHZW5FJFllYXIpCgpjb3VudF95ZWFyc0UgPC0gZGF0YS5mcmFtZSgpCgpmb3IoaSBpbiAxOmxlbmd0aCh5ZWFyc0UpKXsKICBjb3VudF95ZWFyc0VbaSwgIlllYXIiXSA8LSB5ZWFyc0VbaV0KICBjb3VudF95ZWFyc0VbaSwgIm51bWJlcl95ZWFyIl0gPC0gbGVuZ3RoKEdlbkVbd2hpY2goR2VuRSRZZWFyPT15ZWFyc0VbaV0pLDEwXSkKICBjb3VudF95ZWFyc0VbNiwgIm51bWJlcl95ZWFyIl0gPC0gbGVuZ3RoKHdoaWNoKGlzLm5hKEdlbkUkWWVhcik9PVQpKQp9Cgpjb3VudF95ZWFyc0UgPC0gdHJhbnNmb3JtKGNvdW50X3llYXJzRSwgWWVhcj0gcmVvcmRlcihZZWFyLCAtbnVtYmVyX3llYXIpKQpnZ3Bsb3QoZGF0YSA9IGNvdW50X3llYXJzRSwgYWVzKHggPSBZZWFyLCB5ID0gbnVtYmVyX3llYXIsIGNvbG9yPVllYXIpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGw9IndoaXRlIikrCiAgbGFicyh4PSAiWWVhciIsIHk9ICJEYXRhIE51bWJlciIpKwogIHNjYWxlX2NvbG9yX2dyZXkoc3RhcnQ9IDAuMSwgZW5kPTAuNykrCiAgdGhlbWVfY2xhc3NpYygpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKwogIGNvb3JkX2ZsaXAoKQoKYGBgCioqRmlndXJhIDE2LioqIEHDsW9zIHJlZ2lzdHJhZG9zIHBhcmEgY2Fzb3MgY29uIEdlbiBFLiBFbCBhw7FvIG1hcyBhbnRpZ3VvIHF1ZSBzZSByZXBvcnRhIGVzIGVsIGHDsW8gMTg2MCB5IGVsIG1hcyByZWNpZW50ZSBlcyAyMDE1LiBFbCBhw7FvIDIwMTMgZXMgZWwgcXVlIHNlIGhhIHJlcG9ydGFkbyBtYXMgY29uIDkzNyBjYXNvcy4gSWd1YWwgcXVlIGxhICoqRmlndXJhIDE0KiogYSBtZWRpZGEgcXVlIGF2YW56YSBsb3MgYcOxb3Mgc2UgYXVtZW50YSBlbCBudW1lcm8gZGUgY2Fzb3MgcmVwb3J0YWRvcy4KCgoKIyMjIEZyZWN1ZW5jaWEgZGUgbG9zIGHDsW9zIHJlcG9ydGFkb3MgcG9hIGNhZGEgcGFpczogR2VuIEUgIyMjCgpgYGB7ciwgZmlnLndpZHRoID0gMTgsIGZpZy5oZWlnaHQgPSAxMSwgZWNobyA9IEZBTFNFfQp5ZWFyc0UgPC0gbmEub21pdCh1bmlxdWUoR2VuRSRZZWFyKSkKCkNvdW50cnlfbmFtZXNFIDwtIG5hLm9taXQodW5pcXVlKEdlbkUkQ291bnRyeSkpCgpDb3VudHJ5X3llYXIgPC0gZGF0YS5mcmFtZSgpCkNvdW50cnlfeWVhcl9tYXMgPC0gZGF0YS5mcmFtZSgpCmZvcihpIGluIDE6bGVuZ3RoKENvdW50cnlfbmFtZXNFKSl7CiAgZm9yKGogaW4gMTpsZW5ndGgoeWVhcnNFKSl7CiAgICBjby5kYXRhIDwtIEdlbkVbd2hpY2goR2VuRSRDb3VudHJ5PT1Db3VudHJ5X25hbWVzRVtpXSAmIEdlbkUkWWVhcj09eWVhcnNFW2pdKSxjKDgsMTApXQogICAgQ291bnRyeSA8LSBjby5kYXRhJENvdW50cnlbMV0KICAgIFllcmFubyA8LSBjby5kYXRhJFllYXJbMV0KICAgIE51bWJlcl9jYXNlcyA8LSBsZW5ndGgoY28uZGF0YSRZZWFyKQogICAgc3ViZGF0YSA8LSBjYmluZChDb3VudHJ5LCBZZXJhbm8sIE51bWJlcl9jYXNlcykKICAgIENvdW50cnlfeWVhciA8LSByYmluZChDb3VudHJ5X3llYXIsc3ViZGF0YSkKICB9CiAgQ291bnRyeV95ZWFyX21hcyA8LSByYmluZChDb3VudHJ5X3llYXIpCn0KCkNvdW50cnlfeWVhcl9tYXMgPC0gbmEub21pdChDb3VudHJ5X3llYXJfbWFzKQoKQ291bnRyeV95ZWFyX21hcyROdW1iZXJfY2FzZXMgPC0gYXMuY2hhcmFjdGVyKENvdW50cnlfeWVhcl9tYXMkTnVtYmVyX2Nhc2VzKQpDb3VudHJ5X3llYXJfbWFzJE51bWJlcl9jYXNlcyA8LSBhcy5udW1lcmljKENvdW50cnlfeWVhcl9tYXMkTnVtYmVyX2Nhc2VzKQoKQ291bnRyeV95ZWFyX21hcyRZZXJhbm8gPC0gYXMuY2hhcmFjdGVyKENvdW50cnlfeWVhcl9tYXMkWWVyYW5vKQpDb3VudHJ5X3llYXJfbWFzJFllcmFubyA8LSBhcy5udW1lcmljKENvdW50cnlfeWVhcl9tYXMkWWVyYW5vKQoKQ291bnRyeV95ZWFyX21hcyA8LSB0cmFuc2Zvcm0oQ291bnRyeV95ZWFyX21hcywgWWVyYW5vPSByZW9yZGVyKFllcmFubywgK1llcmFubykpCgpnZ3Bsb3QoQ291bnRyeV95ZWFyX21hcywgYWVzKHg9WWVyYW5vLCB5PUNvdW50cnkpKSArIAogIGdlb21fcG9pbnQoYWVzKHNpemU9TnVtYmVyX2Nhc2VzKSkrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkKCgpgYGAKKipGaWd1cmEgMTcuKiogRnJlY3VlbmNpYSBkZSBsb3MgYcOxb3MgcmVwb3J0YWRvcyBwYXJhIGNhZGEgcGFpcyBlbiBjYXNvcyBjb24gR2VuIEUuIExvcyBhw7FvcyBjb24gbWF5b3IgbnVtZXJvIGRlIGNhc29zIHBlcnRlbmVjZW4gYSBhw7FvcyByZWNpZW50ZXMgKDE5OTUtMjAxNCkuIEVsIGHDsW8gMjAxNCByZXBvcnRhICA0MDAgY2Fzb3MgKCoqRmlndXJhIDE2LioqKSwgZGUgbG9zIGN1YWxlcyAyNTkgY2Fzb3Mgc29uIGRlIENoaW5hIGRlIDY3NCBjYXNvcyBxdWUgZXN0ZSBwYWlzIHJlcG9ydGEuIEVuIGJyYXppbCBlbCA4NCUgKDM3MCBjYXNvcykgZGUgbG9zIGNhc29zIHNvbiByZXBvcnRhZG9zIGVuIGVsIGHDsW8gMjAxMywgcXVlIHJlcHJlc2VudGEgbGEgbWl0YWQgZGUgY2Fzb3MgcmVwb3J0YWRvcyBwYXJhIGVzZSBhw7FvLiBQb3IgZWwgY29udHJhcmlvIHBhcmEgU2luZ2FwdXIgcXVlIGVzIGVsIHBhaXMgY29uIG1hcyByZXBvcnRlcyAoKipGaWd1cmEgLioqKSwgbG9zIGNhc29zIG5vIHBlcnRlbmVjZW4gYSB1biBhw7FvIGVzIGVzcGVjaWFsIHNpIG5vIHF1ZSBzZSBkaXN0cmlidXllbiBtYXlvcml0YXJpYW1lbnRlIGVuIGxvcyBhw7FvcyAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLgo=